package ctl.game.util;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @Title: ForMethodUtil.java
 * @Package ctl.game.util
 * @Description: 工具类，用来获取需要的方法
 * @author chentailai
 * @date 2017年7月7日10:58:27
 * @version V1.0
 */
public class ForMethodUtil {
    /**
     * 参数：读取文件路径、反射类名、反射方法名-->产出 : 获取对应的方法
     * @param <T>
     * @param methodName
     * @param clazzName
     * @param filePath
     * @return
     */
    @SuppressWarnings("unchecked")
    public <T> Method getMethod(String filePath,String clazzName, String methodName) {

        try {
            String className = this.getValueByKey(filePath, clazzName);
            Class<?> clazz = (Class<?>) Class.forName(className);//根据类名声明类对象
            Constructor<?> constructor = clazz.getConstructor();//获取类构造器
           T single =  (T) constructor.newInstance();
            Method method =  single.getClass().getMethod(methodName);
            return method;
        } catch (Exception e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 参数：文件路径，键名-->产出键对应的值值
     * @param filePath
     * @param key
     * @return value
     * @throws IOException
     */
    public String getValueByKey(String filePath, String key) throws IOException {
        Properties props = new Properties();
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(filePath);
            props.load(inputStream);
            String value = props.getProperty(key);
            return value;
        } catch (Exception e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        } finally {
            inputStream.close();//关闭文件流
        }
        return null;
    }
}
